package com.mall.order.mq;

import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.Service;
import org.apache.rocketmq.client.exception.MQBrokerException;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.client.producer.SendStatus;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.exception.RemotingException;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.nio.charset.Charset;

/**
 * @author XuBang
 * @TODO: 作为发送消息的工具类，放入容器，作为组件
 * @date 2021/11/4$
 * @trainOfthought: 1.DefaultMQProducer 来自 RocketMQ,不能被Spring容器直接管理；
 * ---> 解决方法：（1）定义一个init（自定义名字）方法：直接定义producer对象+地址+启动
 * （2）@PostConstruct注解该方法
 * ---->Spirng可以直接管理：DefaultMQProducer，直接使用发送延迟消息信息
 * 2.pipeline设计模式--->message-handler:（1）获取生成的订单id；（2）发送一个包含订单id的延迟消息
 * 3.添加事务
 *
 * 注：养成在关键节点添加日志的习惯
 */
@Component
@Slf4j    //日志对应的注解
public class DelayOrderCancelProducer {

    private DefaultMQProducer producer = null;

    /**
     * 定义方法&注解 --->spring容器直接管理：DefaultMQProducer（包含：地址&对象&启动）
     */
    @PostConstruct
    private void init() {
        producer = new DefaultMQProducer("bangbangtang");  //producer对象
        producer.setNamesrvAddr("127.0.0.1:9876");    //地址
        try {
            producer.start();  //启动
        } catch (MQClientException e) {
            e.printStackTrace();
        }
    }

    /**
     * 根据传入的orderId，发送延迟消息（实现订单自动取消的延迟消息）
     *
     * @param orderId
     * @return
     */
    public boolean SendDelayOrderMessage(String orderId) {
        log.info("enter sendDelayOrderMessage{}",orderId);
        //1.封装消息
//        Message message = new Message("orderCancel_delay_message", orderId.getBytes(Charset.forName("utf-8")));

        Message message = new Message();
        message.setTopic("orderCancel_delay_message");
        message.setBody(orderId.getBytes(Charset.forName("utf-8")));

        /**
         * 关键节点：设置延迟消息，延迟级别
         */
        // 延迟消息，需要制定消息的延迟级别
        // 1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
        // 1  2  3   4   5  6  7  8  9  10 11 12 13  14  15 16  17 18
        message.setDelayTimeLevel(3);

        //查看延迟时间的信息设置
        long startTime = System.currentTimeMillis();
        message.putUserProperty("startTime",startTime+"");

        //2发送消息
        SendResult result = null;
        try {
            log.info("before send message{}",orderId);
            result = producer.send(message);
        } catch (MQClientException e) {
            e.printStackTrace();
        } catch (RemotingException e) {
            e.printStackTrace();
        } catch (MQBrokerException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //3.根据返回结果，进行判断
        if (result != null && SendStatus.SEND_OK.equals(result.getSendStatus())) {
            //消息发送成功
            log.info("producer send message,success");
            return true;
        }
        log.info("hello, this is xubang.");

        return false;
    }
}
